package com.itaming.lycheeframework.security.properties;

import com.itaming.lycheeframework.common.constant.FrameworkConstant;
import com.itaming.lycheeframework.security.token.TokenExpiresInPair;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.context.properties.NestedConfigurationProperty;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * Security配置参数
 *
 * @author A.Ming
 */
@ConfigurationProperties(LycheeSecurityProperties.PREFIX)
@Data
public class LycheeSecurityProperties {

    /**
     * 配置前缀
     */
    public static final String PREFIX = FrameworkConstant.PROPERTIES_ROOT_NAME + ".security";

    /**
     * Auth配置参数
     */
    @NestedConfigurationProperty
    private Auth auth = new Auth();

    /**
     * Token配置参数
     */
    @NestedConfigurationProperty
    private Token token = new Token();

    /**
     * Auth配置参数
     */
    @Data
    public static class Auth {

        /**
         * 是否启用
         */
        private boolean enabled = true;

        /**
         * 排除路径
         */
        private List<String> excludePath = new ArrayList<>();

    }

    /**
     * Token配置参数
     *
     * @author A.Ming
     */
    @Data
    public static class Token {

        /**
         * 请求头中token的参数名
         */
        private String headerKey = "Authorization";

        /**
         * 请求参数中token的参数名
         */
        private String paramKey = "token";

        /**
         * JWT签名密钥
         */
        private String jwtSecretKey;

        /**
         * 是否有状态
         */
        private boolean stateful = false;

        /**
         * 是否限制用户只能保持单一会话
         */
        private boolean single = false;

        /**
         * 单一会话模式，默认客户端单一
         *
         * <ul>
         *   <li>GLOBAL: 全局单一</li>
         *   <li>CLIENT: 客户端单一</li>
         * </ul>
         */
        private SingleMode singleMode = SingleMode.CLIENT;

        /**
         * 过期时间
         *
         * <p>
         * 配置每个客户端的 Token 过期时间
         * <blockquote><pre>
         * expires-in:
         *   WEB:  # ClientID
         *     access: 43200
         *     refresh: 604800
         * </pre></blockquote>
         */
        private Map<String, TokenExpiresInPair> expiresIn = new HashMap<>();

    }

    /**
     * 单一会话模式枚举
     */
    public enum SingleMode {

        /**
         * 全局单一
         */
        GLOBAL,

        /**
         * 客户端单一
         */
        CLIENT,

    }

}
